﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using PortalCurriculo.Domain;
using PortalCurriculo.Util.CustomControls.ListViewObjects;
using PortalCurriculo.Util.Translation;
using PortalCurriculo.WebUI.Constants;
using PortalCurriculo.WebUI.Helpers;
using PortalCurriculo.WebUI.UserControls.Basico;
using PortalCurriculo.WebUI.UserControls.Curriculo.Cadastro;
using Button = PortalCurriculo.WebUI.Constants.Button;
using ImageButton = System.Web.UI.WebControls.ImageButton;
using NecessidadeEspecial = PortalCurriculo.WebUI.UserControls.Curriculo.Visualizacao.NecessidadeEspecial;
using Profissional = PortalCurriculo.Domain.Profissional;

namespace PortalCurriculo.WebUI.Curriculo
{
    public partial class CadastroCurriculo : EntityAccessHelper
    {
        private static Profissional Profissional { get; set; }
        private static List<Domain.Curriculo> Curriculos { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            Profissional = new Profissional {IdUsuario = UsuarioLogado.Id}.Selecionar();

            if (Profissional == null) return;

            SessionHelper.Session(SessionHelper.SessionName.PortadorNecessidadeEspecial,
                                  Profissional.PortadorNecessidadeEspecial);

            CarregarDadosProfissional();
            CarregarDeficiencias();
            CarregarCurriculos();
            AtualizarListView();
        }

        private void CarregarDeficiencias()
        {
            divDeficiencias.Visible = Profissional.PortadorNecessidadeEspecial;

            if (!Profissional.PortadorNecessidadeEspecial) return;

            Deficiencias.Entidades = Profissional.DeficienciaProfissionals.ToList();
            Deficiencias.IdProfissional = Profissional.Id;
            PreencherDadosCurriculo(Deficiencias,
                                    typeof (NecessidadeEspecial),
                                    typeof (UserControls.Curriculo.Cadastro.NecessidadeEspecial));
        }

        private void PreencherDadosCurriculo(Tela curriculoControle, Type tipoVisualizacao, Type tipoCadastro)
        {
            curriculoControle.IdUsuario = Profissional.IdUsuario;
            curriculoControle.TipoUserControlVisualizacao = tipoVisualizacao;
            curriculoControle.TipoUserControlCadastro = tipoCadastro;
        }

        private void CarregarDadosProfissional()
        {
            CadastroProfissional.Entidade = Profissional;
            PreencherDadosCurriculo(CadastroProfissional,
                                    typeof (UserControls.Curriculo.Visualizacao.Profissional),
                                    typeof (UserControls.Curriculo.Cadastro.Profissional));
        }

        private void AtualizarListView()
        {
            foreach (var item in lsvCurriculo.Items)
            {
                var curriculo = ((List<Domain.Curriculo>) lsvCurriculo.DataSource)[lsvCurriculo.Items.IndexOf(item)];

                if (curriculo == null || string.IsNullOrEmpty(curriculo.ArquivoDOC) ||
                    curriculo.ArquivoDOC.ToLower().EndsWith(".docx") || curriculo.ArquivoDOC.ToLower().EndsWith(".docx"))
                    continue;

                if (curriculo.ArquivoDOC.ToLower().EndsWith(".pdf"))
                    ((ImageButton) item.FindControl("imbArquivoDoc")).ImageUrl = Image.Pdf;
            }
        }

        private void CarregarCurriculos()
        {
            Curriculos = new Domain.Curriculo {IdProfissional = Profissional.Id}.SelecionarPorProfissional();
            var cadastroCurriculo = Translator.TranslateMessage(Helpers.Curriculo.Messages.CadastroCurriculo,
                                                                AppRelativeVirtualPath);
            lsvCurriculo.TableStructure = new TableStructure(cadastroCurriculo, cadastroCurriculo, "tableFullWidth");

            var fields = new List<Field>
                             {
                                 new Field("Objetivo",
                                           Translator.TranslateMessage(Helpers.Curriculo.Messages.Objetivo,
                                                                       AppRelativeVirtualPath)),
                                 new Field("DataUltimaAtualizacao",
                                           Translator.TranslateMessage(
                                               Helpers.Curriculo.Messages.DataUltimaAtualizacao, AppRelativeVirtualPath)),
                             };

            var actions = CriarActionControls();

            lsvCurriculo.DataSource = Curriculos;
            lsvCurriculo.DataBind<Domain.Curriculo>(fields, actions);
        }

        private List<ActionControl> CriarActionControls()
        {
            var imbArquivoDoc = new ActionControl
                                    {
                                        Control = new ImageButton
                                                      {
                                                          ID = "imbArquivoDoc",
                                                          ImageUrl = Image.Doc,
                                                          AlternateText =
                                                              Translator.TranslateMessage(
                                                                  Helpers.Curriculo.Messages.BaixarCurriculoDoc,
                                                                  AppRelativeVirtualPath),
                                                          CommandArgument =
                                                              string.Concat(Path.CurriculoDocVirtual, "[ArquivoDOC]"),
                                                          CssClass = Image.CssClass.Small
                                                      }
                                    };
            var buttons = new Button(AppRelativeVirtualPath, Image.CssClass.Small);
            imbArquivoDoc.ClickImageButton += imbArquivoDoc_Click;
            var imbExcluir = new ActionControl {Control = buttons.DeleteImage};
            imbExcluir.ClickImageButton += imbExcluir_Click;
            var imbEditar = new ActionControl {Control = buttons.EditImage};
            imbEditar.ClickImageButton += imbEditar_Click;
            var imbView = new ActionControl {Control = buttons.ViewImage};
            imbView.ClickImageButton += imbView_Click;

            return new List<ActionControl> {imbArquivoDoc, imbExcluir, imbView};
        }

        protected void imbArquivoDoc_Click(object sender, ImageClickEventArgs imageClickEventArgs)
        {
            var arquivo = ((ImageButton) sender).CommandArgument;
            Response.Redirect(arquivo);
        }

        protected void imbView_Click(object sender, ImageClickEventArgs imageClickEventArgs)
        {
            var id = ((ImageButton) sender).CommandArgument;
            Response.Redirect(string.Concat("~/Curriculo/VisualizarCurriculo.aspx?id=", id));
        }

        protected void imbExcluir_Click(object sender, ImageClickEventArgs imageClickEventArgs)
        {
            var arquivo = ((ImageButton) sender).CommandArgument;
            Response.Redirect(arquivo);
        }

        protected void imbEditar_Click(object sender, ImageClickEventArgs imageClickEventArgs)
        {
            var arquivo = ((ImageButton) sender).CommandArgument;
            Response.Redirect(arquivo);
        }

        protected void lnkAdicionarCurriculo_Click(object sender, EventArgs e)
        {
            var cargoPretendido = ((CargoPretendido) PopupCurriculo.FindControl("Cargos"));
            cargoPretendido.CargosCurriculo = null;
            cargoPretendido.CarregarCargos();
            PopupCurriculo.Show();
        }

        public void ShowPopup()
        {
            PopupCurriculo.Show();
        }

        protected void lnkSalvarCurriculo_Click(object sender, EventArgs e)
        {
            var cargosPretendidos = ((CargoPretendido) PopupCurriculo.FindControl("Cargos")).CargosCurriculo;
            if (cargosPretendidos == null || cargosPretendidos.Count == 0)
            {
                PopupCurriculo.Show();
                WebHelper.ShowMessageBox(
                    Translator.TranslateMessage(Messages.MinimoCargoPretendido, Page.AppRelativeVirtualPath),
                    ref uppCurriculo);
                return;
            }

            var curriculoControl = (UserControls.Curriculo.CadastroCurriculo) PopupCurriculo.FindControl("Curriculo");

            var curriculo = new Domain.Curriculo
                                {
                                    Objetivo = curriculoControl.Objetivo.Value,
                                    Ativo = true,
                                    DataCadastro = DateTime.Now,
                                    DataUltimaAtualizacao = DateTime.Now,
                                    IdProfissional = Profissional.Id,
                                    //TODO 
                                    IdNivelProfissional = 4
                                };
            curriculo.Save();

            foreach (var cargo in ((CargoPretendido) PopupCurriculo.FindControl("Cargos")).CargosCurriculo)
            {
                var cargoCurriculo = new CargoCurriculo
                                         {
                                             IdCurriculo = curriculo.Id,
                                             Ativo = true,
                                             IdCargo = cargo.IdCargo
                                         };

                cargoCurriculo.Save();
            }

            if (curriculoControl.FileArquivoDoc.HasFile)
            {
                var arquivo = string.Concat(MapPath("~"), Path.CurriculoDocFisico, curriculo.Id, ".",
                                            curriculoControl.FileArquivoDoc.PostedFile.FileName.Split('.').Last());
                curriculoControl.FileArquivoDoc.SaveAs(arquivo);
                curriculo.ArquivoDOC = arquivo.Split(Convert.ToChar(@"\")).Last();
                curriculo.Save();
            }

            Curriculos.Add(curriculo);
            CarregarCurriculos();

            PopupCurriculo.Close();
        }
    }
}